import { login, getInfo, getUserDetailById } from '@/api/user'
// 引入工具里的 获得token的方法
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 引入 获取用户信息

// 引入routes 导入的方法
import { resetRouter } from '@/router'
// 保存状态的数据
const state = {
  // 1.保存token
  token: getToken(), // 默认为空
  // 一 保存用户信息基本资料
  userInfo: {} // 这里随时都要更新 所以不需要持久化管理
}

// 同步更新
const mutations = {
  // 2.更新token
  setToken(state, payload) {
    // 更新state里面的token
    state.token = payload
    // 3.更新获取一份token 存储到本地
    setToken(payload)
  },
  // 4.退出登录时删除token
  removeToken(state) {
    // 4.1 清空vuex 的token
    state.token = null
    removeToken() // 删除本地缓存token
  },

  // 二 更新用户信息
  setUserInfo(state, userinfo) {
    // 赋值给 vuex 一份 用于更新
    state.userInfo = userinfo
    // console.log(state.userInfo.companyId)
  },
  // 二点一 退出的时候删除用户信息
  removeUserInfo(state) {
    // 赋值为空对象
    state.userInfo = {}
  }

}

//  异步交给mutations 更新
const actions = {
  // 5.发送异步请求 获取token
  async login({ commit }, payload) {
    // 5.1 封装返回值
    const res = await login(payload)
    // 5.2 判断返回成功
    // 5.2.1 如果成功之后 把token存储  让mutataions 更新
    commit('setToken', res)

    setTimeStamp() // 将当前最新时间写入缓存
  },
  //
  // 三 获取用户信息 发送异步请求
  async getUserInfo({ commit }) {
    // 三点一
    const res = await getInfo()
    // 四==获取头像发送请求
    const detail = await getUserDetailById(res.userId)
    // 三点二 传给vuex的mutations 更新数据

    // 四点一 提交mutations
    commit('setUserInfo', { ...res, ...detail }) //
    //
    return res
  },
  // 四 登出
  async logout({ commit }) {
    commit('removeToken') // 删除缓存中的token 和 vuex的token
    // 删除用户信息
    commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // 重置vuex的路由数据 怎me调用另外一个子模块
    commit('permission/setRoutes', [], { root: true })
    // 表示root:true commit 实际是用顶级调用方式
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
